<?php
/**
 * Created by PhpStorm.
 * User: hebidu
 * Date: 15/10/20
 * Time: 13:41
 */

namespace Test\Controller;


use Admin\Api\InternationalAlipayNotifyApi;
use Common\Api\AccountApi;
use Shop\Api\OrdersApi;
use Shop\Api\OrdersExpressApi;
use Shop\Api\OrdersInfoViewApi;
use Shop\Model\OrdersModel;

class TestZjportController extends  TestController{


    public function order(){
        $order_id = 17;
        $totalCount = '5';//总件数 ，包裹中独立包装的物品总数，不考虑物品计量单位


        $result = apiCall(OrdersInfoViewApi::GET_INFO,array(array('id'=>$order_id)));
        if(!$result['status']){
            $this->error($result['info']);
        }
        if(is_null($result['info'])){
            $this->error("订单无效(BY101)");
        }
        $order_info = $result['info'];


        $data = array(
            //其它特殊固定的
            'totalCount'=>$totalCount,       //总件数 ，包裹中独立包装的物品总数，不考虑物品计量单位
            'payType'=>'02',                //支付类型 01:银行卡支付 02:余额支付 03:其他

            //jkfSign
            'companyCode'=>'341905490',
            'businessNo'=>$order_info['order_code'],
            'businessType'=>'IMPORTORDER',
            'declareType'=>'1',
            'note'=>'',
            //购买人信息

            //head固定部分
            'companyName'=>'杭州马班科技有限公司',
//            'companyCode'=>'341905490',
            'eCommerceCode'=>'341905490',
            'eCommerceName'=>'杭州马班科技有限公司',
            'logisCompanyName'=>'EMS', //物流企业名称
            'logisCompanyCode'=>'3301980101', //物流企业编码
            'senderCountry'=>'142',//发件人国别
            'senderName'=>'杭州马班科技有限公司',//发件人名称
            'rate'=>'1',//汇率，人民币填写1
            'paperType'=>'01',//证件类型01:身份证
            'payCompanyCode'=>'zf14021901', //支付公司编码
            'zipCode'=>'312000',  //邮编
            'currCode'=>'142',
            //订单中取得

            'orderNo'=>$order_info['order_code'],      //订单编号
            'consigneeEmail'=>$order_info['email'],// 'hebiduhebi@126.com',    //收件人邮箱
            'consigneeTel'=>$order_info['mobile'],      //收件人电话
            'consignee'=>$order_info['contactname'],        //收件人
            'consigneeAddress'=>$order['country'].$order['province'].$order['city'].$order['area'].$order['detailinfo'],//收件人地址
            'purchaserId'=>$order_info['uid'],//购买人ID
            'orderTaxAmount'=>$order_info['taxamount'],         //订单税款
            'orderGoodsAmount'=>$order_info['goodsamount'],      //订单货款
            'feeAmount'=>$order_info['post_price'],              //运费

        );

        $data = array_merge($data,$this->getInfoFromOrderInfo($order_info));

        $data = array_merge($data,$this->getExpressInfo($order_info));
        $result = $this->checkData($data);
        if(!empty($result)){
            $this->error($result);
        }
//        dump($data);
        $return = $this->requestZjport($data);
//        dump($return);
        if($return['status']){

            $data = $return['data'];
            if(is_array($data)){
                $result = $data['result'];
                if($result['code'] == 0){

                }else{
                    dump($result['msg']);
                }
            }else{
                dump("返回数据错误!");
            }

        }else{
            dump($return['msg']);
        }
    }

    /**
     * 获取物流相关信息
     * @param $order
     */
    private function  getExpressInfo($order){

        $map = array(
            'order_code'=>$order['order_code'],
        );
        $payInfo = array();
        if($order['pay_status'] == OrdersModel::ORDER_PAID){

            $result = apiCall(InternationalAlipayNotifyApi::GET_INFO,array($map));
            if(!$result['status']){
                $this->error($result['info']);
            }

            if(is_null($result['info'])){//
                $this->error("订单支付信息获取失败,无法申报!");
            }

            $payInfo = $result['info'];

        }else{
            $this->error("订单尚未支付,无法申报!");
        }

        if(!($payInfo['trade_status'] == 'TRADE_FINISHED')){
            $this->error("订单支付失败,无法申报!");
        }

        $result = apiCall(OrdersExpressApi::GET_INFO,array($map));


        if(!$result['status']){
            $this->error($result['info']);
        }

        if(is_null($result['info'])){
            $this->error("订单尚未发货,无法申报!");
        }

        $express = $result['info'];


        $data  = array(
            'walBills'=>$express['expressno'],
            'payNumber'=>$payInfo['trade_no'],
            'totalAmount'=>$payInfo['total_fee'],
            'tradeTime'=>$payInfo['notify_time'],
        );

        return $data;
    }

    private function getInfoFromOrderInfo($order){

        $data = array(
            //jkfSign
//            'companyCode'=>'341905490',
            'businessNo'=>$order['order_code'],
            'businessType'=>'IMPORTORDER',
            'declareType'=>'1',
            'note'=>'',
            //购买人信息
            'id'=>$order['uid'],
            'name'=>$order['contactname'],
            'email'=>$order['email'],
            'telNumber'=>$order['mobile'],
            'address'=>$order['country'].$order['province'].$order['city'].$order['area'].$order['detailinfo'],
            'paperNumber'=>$order['id_card'],

        );// $order_info

        return $data;

    }


    public function index(){

        $companyCode = "341905940";
        $order_id = 'OR'. time();

//        if(IS_POST){
//
//            $data = array(
//                //jkfSign
//                'companyCode'=>$companyCode,
//                'businessNo'=>$order_id,
//                'businessType'=>'IMPORTORDER',
//                'declareType'=>'1',
//                'note'=>'',
//                //购买人信息
//                'id'=>I('post.id',''),
//                'name'=>I('post.name',''),
//                'email'=>I('post.email',''),
//                'telNumber'=>I('post.telNumber',''),
//                'address'=>I('post.address',''),
//                'paperType'=>I('post.paperType',''),
//                'paperNumber'=>I('post.paperNumber',''),
//                //订单信息
//
//            );
//
//            $data = array_merge($data,$this->getImportHead());
//
//            $data = array_merge($data,$this->getOrderDetail());
//
//            $return = $this->requestZjport($data);
//            dump($return);
//            if($return['status']){
//
//                $data = $return['data'];
//                if(is_array($data)){
//                    $result = $data['result'];
//                    if($result['code'] == 0){
//
//                    }else{
//                        dump($result['msg']);
//                    }
//                }else{
//                    dump("返回数据错误!");
//                }
//
//            }else{
//                dump($return['msg']);
//            }
//            return;
//        }

//        $this->assign("companyCode",$companyCode);
//        $this->assign("orderid",$order_id);
        $this->display();
    }

    private function getOrderDetail(){

        $detail = array(
            'goodsOrder'=>1 , //必填，商品序号，序号不大于50，
            'goodsName'=>'商品名称',
            'codeTs'=>'01010150' , // 行邮税号
            'goodsModel'=>'颜色:红色;尺寸:I', //商品规格、型号
            'originCountry'=>'116', //产销国
            'unitPrice'=>'14.0', //成交单价
            'goodsCount'=>'10',  //成交数量
            'goodsUnit'=>''   ,  // 成交计量单位
            'grossWeight'=>'' ,//  商品毛重
        );





        return $detail;

    }

    private function getImportHead(){
        $tradeTime = date('Y-m-d h:i:s',time());
        $head = array(
            'eCommerceCode'=>'341905490',
            'eCommerceName'=>'杭州马班科技有限公司',
            'companyName'=>'杭州马班科技有限公司',
            'companyCode'=>'341905490',
            'logisCompanyName'=>'EMS', //物流企业名称
            'logisCompanyCode'=>'3301980101', //物流企业编码
            'senderCountry'=>'142',//发件人国别
            'senderName'=>'杭州马班科技有限公司',//发件人名称
            'rate'=>'1',//汇率，人民币填写1
            'note'=>'',   // 备注信息
            'postMode'=>'3',         //发货方式 , 物流方式 1.邮政小包 2.快件 3.EMS
            'ieFlag'=>'I',       //进出口标识
            //以上信息基本都比较固定


            'totalCount'=>'5',       //总件数 ，包裹中独立包装的物品总数，不考虑物品计量单位
            'payNumber'=>'2200011564789',    //支付单号 </payNumber>
            'orderNo'=>'2000001123456',      //订单编号
            'payType'=>'02',                //支付类型 01:银行卡支付 02:余额支付 03:其他
            'payCompanyCode'=>'zf14021901', //支付公司编码

            'orderTaxAmount'=>'10',         //订单税款
            'orderGoodsAmount'=>'100',      //订单货款
            'feeAmount'=>'5',               //运费
            'currCode'=>'142',              //成交币制 , 142	人民币
            'totalAmount'=>'110',           //成交总价
            'tradeTime'=> $tradeTime,         //成交时间


            'consigneeEmail'=>'hebiduhebi@126.com',    //收件人邮箱
            'consigneeTel'=>'13484379290',      //收件人电话
            'consignee'=>'何必都',        //收件人
            'consigneeAddress'=>'浙江省杭州市下沙区金沙湖', //收件人地址
            'purchaserId'=>'10',//购买人ID
            'zipCode'=>'312000',  //邮编
            'wayBills'=>'1,2', //运单号列表,单号之间分号隔开



        );

        return $head;

    }




    private function requestZjport($data){
        $url = "http://localhost:8080/itboye_banmaapi/zjport/Index/uploadOrderAction";

        $result = $this->curlPost($url,$data);
        return $result;
    }
    protected function curlPost($url, $data) {

        $ch = curl_init();
        $header = array('Accept-Charset'=>"utf-8");

        curl_setopt($ch,CURLOPT_TIMEOUT,20);//30秒超时
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, ($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $tmpInfo = curl_exec($ch);
        $error = curl_errno($ch);
        if ($error) {
            $error = $this->getCurlErrMsg($error);
            return array('status' => false, 'msg' => $error,'data'=>'');
        } else {
            $js = json_decode($tmpInfo,true);
            return array('status' => true,'msg'=>'处理成功', 'data' => $js);
        }
    }

    protected function curlGet($url) {
        $ch = curl_init();
        $header = "Accept-Charset: utf-8";
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $temp = curl_exec($ch);
        return $temp;
    }

    private function getCurlErrMsg($error_no){

        $error_no = strval($error_no);
        if(isset(TestZjportController::$error_arr[$error_no])){
            return TestZjportController::$error_arr[$error_no];
        }
        return "未知错误!";
    }

    public static $error_arr = array(
        '1'=>'您传送给 libcurl 的网址使用了此 libcurl 不支持的协议。 可能是您没有使用的编译时选项造成了这种情况（可能是协议字符串拼写有误，或没有指定协议 libcurl 代码）。',
        '2'=>'非常早期的初始化代码失败。 可能是内部错误或问题。',
        '3'=>'网址格式不正确。',
        '5'=>'无法解析代理服务器。 指定的代理服务器主机无法解析。',
        '6'=>'无法解析主机。 指定的远程主机无法解析。',
        '7'=>'无法通过 connect() 连接至主机或代理服务器。',
        '8'=>'在连接到 FTP 服务器后，libcurl 需要收到特定的回复。 此错误代码表示收到了不正常或不正确的回复。 指定的远程服务器可能不是正确的 FTP 服务器。',
        '9'=>' 我们无法访问网址中指定的资源。 对于 FTP，如果尝试更改为远程目录，就会发生这种情况。',
        '11'=>'在将 FTP 密码发送到服务器后，libcurl 需要收到正确的回复。 此错误代码表示返回的是意外的代码。',
        '13'=>'libcurl 无法从服务器端收到有用的结果，作为对 PASV 或 EPSV 命令的响应。 服务器有问题。',
        '14'=>'FTP 服务器返回 227 行作为对 PASV 命令的响应。如果 libcurl 无法解析此行，就会返回此代码。',
        '15'=>'在查找用于新连接的主机时出现内部错误。',
        '17'=>'在尝试将传输模式设置为二进制或 ascii 时发生错误。',
        '18'=>'文件传输尺寸小于或大于预期。当服务器先报告了一个预期的传输尺寸，然后所传送的数据与先前指定尺寸不相符时，就会发生此错误。',
        '19'=>'RETR 命令收到了不正常的回复，或完成的传输尺寸为零字节。',
        '21'=>'在向远程服务器发送自定义 “QUOTE” 命令时，其中一个命令返回的错误代码为 400 或更大的数字（对于 FTP），或以其他方式表明命令无法成功完成。',
        '22'=>'如果 CURLOPT_FAILONERROR 设置为 TRUE，且 HTTP 服务器返回 >= 400 的错误代码，就会返回此代码。 （此错误代码以前又称为 CURLE_HTTP_NOT_FOUND。）',
        '23'=>'在向本地文件写入所收到的数据时发生错误，或由写入回调 (write callback) 向 libcurl 返回了一个错误。',
        '25'=> '无法开始上传。 对于 FTP，服务器通常会拒绝执行 STOR 命令。错误缓冲区通常会提供服务器对此问题的说明。 （此错误代码以前又称为 CURLE_FTP_COULDNT_STOR_FILE。）',
        '26'=> '读取本地文件时遇到问题，或由读取回调 (read callback) 返回了一个错误。',
        '27'=> '内存分配请求失败。此错误比较严重，若发生此错误，则表明出现了非常严重的问题。',
        '28'=> ' 操作超时。 已达到根据相应情况指定的超时时间。 请注意： 自 Urchin 6.6.0.2 开始，超时时间可以自行更改。 要指定远程日志下载超时，请打开 urchin.conf 文件，取消以下行的注释标记：',
         '30'=>' FTP PORT 命令返回错误。 在没有为 libcurl 指定适当的地址使用时，最有可能发生此问题。 请参阅 CURLOPT_FTPPORT。',
         '31'=>' FTP REST 命令返回错误。如果服务器正常，则应当不会发生这种情况。',
         '33'=>' 服务器不支持或不接受范围请求。',
         '34'=>' 此问题比较少见，主要由内部混乱引发。',
         '35'=>' 同时使用 SSL/TLS 时可能会发生此错误。您可以访问错误缓冲区查看相应信息，其中会对此问题进行更详细的介绍。可能是证书（文件格式、路径、许可）、密码及其他因素导致了此问题。',
         '36'=>' 尝试恢复超过文件大小限制的 FTP 连接。',
         '37'=>' 无法打开 FILE:// 路径下的文件。原因很可能是文件路径无法识别现有文件。 建议您检查文件的访问权限。',
         '38'=>' LDAP 无法绑定。LDAP 绑定操作失败。',
         '39'=>' LDAP 搜索无法进行。',
         '41'=>' 找不到函数。 找不到必要的 zlib 函数。',
         '42'=>' 由回调中止。 回调向 libcurl 返回了 “abort”。',
         '43'=>' 内部错误。 使用了不正确的参数调用函数。',
         '45'=>' 界面错误。 指定的外部界面无法使用。 请通过 CURLOPT_INTERFACE 设置要使用哪个界面来处理外部连接的来源 IP 地址。 （此错误代码以前又称为 CURLE_HTTP_PORT_FAILED。）',
         '47'=>' 重定向过多。 进行重定向时，libcurl 达到了网页点击上限。请使用 CURLOPT_MAXREDIRS 设置上限。',
         '48'=>' 无法识别以 CURLOPT_TELNETOPTIONS 设置的选项。 请参阅相关文档。',
         '49'=>' telnet 选项字符串的格式不正确。',
         '51'=>' 远程服务器的 SSL 证书或 SSH md5 指纹不正确。',
         '52'=>' 服务器未返回任何数据，在相应情况下，未返回任何数据就属于出现错误。',
         '53'=>' 找不到指定的加密引擎。',
         '54'=>' 无法将选定的 SSL 加密引擎设为默认选项。',
         '55'=>' 无法发送网络数据。',
         '56'=>' 接收网络数据失败。',
         '58'=>' 本地客户端证书有问题',
         '59'=>' 无法使用指定的密钥',
         '60'=>' 无法使用已知的 CA 证书验证对等证书',
         '61'=>' 无法识别传输编码',
         '62'=>' LDAP 网址无效',
         '63'=>' 超过了文件大小上限',
         '64'=>' 请求的 FTP SSL 级别失败',
         '65'=>' 进行发送操作时，curl 必须回转数据以便重新传输，但回转操作未能成功',
         '66'=>' SSL 引擎初始化失败',
         '67'=>' 远程服务器拒绝 curl 登录（7.13.1 新增功能）',
         '68'=>' 在 TFTP 服务器上找不到文件',
         '69'=>' 在 TFTP 服务器上遇到权限问题',
         '70'=>' 服务器磁盘空间不足',
         '71'=>' TFTP 操作非法',
         '72'=>' TFTP 传输 ID 未知',
         '73'=>' 文件已存在，无法覆盖',
         '74'=>' 运行正常的 TFTP 服务器不会返回此错误',
         '75'=>' 字符转换失败',
         '76'=>' 调用方必须注册转换回调',
         '77'=>' 读取 SSL CA 证书时遇到问题（可能是路径错误或访问权限问题）',
         '78'=>' 网址中引用的资源不存在',
         '79'=>' SSH 会话中发生无法识别的错误',
         '80'=>' 无法终止 SSL 连接',
    );

}